/*
V1.0.1
上电后，用手机搜索热点ESP Hotspot，密码12345678。浏览器自动打开，进入配网页面，输入WiFi名称和密码，点击保存，即可完成配网。
*/
#ifndef ESPWIFICFG_H
#define ESPWIFICFG_H

#include <DNSServer.h>
#include <WebServer.h>
#include <WiFi.h>
#include <Preferences.h>

class EspWifiCfg {
   public:
    EspWifiCfg(const char* apSsid = "ESP Hotspot", const char* apPassword = "12345678");
    void begin();  // 启动热点和Web配置服务
    void loop();   // 在主循环里调用
    // 检查并更新 WiFi 连接状态。如果状态变化，更新 wifiConnected 并在连接成功时设置 lastNTPAttempt
    // 返回 true 表示状态发生了变化
    bool updateWifiStatus(bool &wifiConnected, unsigned long &lastNTPAttempt);
    // 需要用户重新配网时返回 true（保存的SSID不存在或保存的密码无效）
    bool reconfigNeeded() const { return _reconfigNeeded; }

   private:
    const char* _apSsid;
    const char* _apPassword;

    WebServer _server;
    DNSServer _dnsServer;
    Preferences _prefs;
    bool _prefsOpened = false;
    bool _reconfigNeeded = false;
    bool _apActive = false; // track if AP/captive portal is active
    String _savedSsid;
    String _savedPwd;

    void _handleRoot();      // 显示配网页面
    void _handleWifiList();  // 返回WiFi扫描结果
    void _handleConnect();   // 处理WiFi连接请求
    void _handleNotFound();  // 捕获未知路径

    void _openPrefs();
    void _loadCredentials();
    void _saveCredentials(const String &ssid, const String &pwd);
    void _attemptAutoConnect();
    void _startCaptivePortal();
    void _stopCaptivePortal();
};

#endif
